package cinvestav.adviseme.bean;

import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;

import org.springframework.security.context.SecurityContextHolder;

import cinvestav.adviseme.controller.IPersonaController;
import cinvestav.adviseme.controller.PersonaController;
import cinvestav.adviseme.datamodel.LugarAgregado;
import cinvestav.adviseme.datamodel.Persona;
import cinvestav.adviseme.util.DBException;
import cinvestav.adviseme.util.DataBaseDictionary;

public class FriendListViewBean {
	protected IPersonaController personaController;
	protected List<Persona> amigos;
	protected Persona persona;
	
	protected Boolean slctId;
	protected String idFiltro;
	
	protected Boolean slctNombre;
	protected String nombreFiltro;
	
	protected Boolean slctUsuario;
	protected String usuarioFiltro;
	
	protected Boolean slctCorreo;
	protected String correoFiltro;

	protected String errorMsg;
	
	public String getErrorMsg() {
		return errorMsg;
	}

	public void setErrorMsg(String errorMsg) {
		this.errorMsg = errorMsg;
	}

	public Persona getPersona() {
		return persona;
	}

	public void setPersona(Persona persona) {
		this.persona = persona;
	}

	public Boolean getSlctId() {
		return slctId;
	}

	public void setSlctId(Boolean slctId) {
		this.slctId = slctId;
	}

	public String getIdFiltro() {
		return idFiltro;
	}

	public void setIdFiltro(String idFiltro) {
		this.idFiltro = idFiltro;
	}

	public Boolean getSlctNombre() {
		return slctNombre;
	}

	public void setSlctNombre(Boolean slctNombre) {
		this.slctNombre = slctNombre;
	}

	public String getNombreFiltro() {
		return nombreFiltro;
	}

	public void setNombreFiltro(String nombreFiltro) {
		this.nombreFiltro = nombreFiltro;
	}

	public Boolean getSlctUsuario() {
		return slctUsuario;
	}

	public void setSlctUsuario(Boolean slctUsuario) {
		this.slctUsuario = slctUsuario;
	}

	public String getUsuarioFiltro() {
		return usuarioFiltro;
	}

	public void setUsuarioFiltro(String usuarioFiltro) {
		this.usuarioFiltro = usuarioFiltro;
	}

	public Boolean getSlctCorreo() {
		return slctCorreo;
	}

	public void setSlctCorreo(Boolean slctCorreo) {
		this.slctCorreo = slctCorreo;
	}

	public String getCorreoFiltro() {
		return correoFiltro;
	}

	public void setCorreoFiltro(String correoFiltro) {
		this.correoFiltro = correoFiltro;
	}

	public FriendListViewBean() throws DBException {
		personaController = new PersonaController();
		amigos = new LinkedList<Persona>();
	}
	
	public IPersonaController getPersonaController() {
		return personaController;
	}

	public void setPersonaController(
			IPersonaController personaController) {
		this.personaController = personaController;
		init();
	}

	public List<Persona> getAmigos() {
		return amigos;
	}

	public void setAmigos(List<Persona> amigos) {
		this.amigos = amigos;
	}

	private void init(){
		try {
			// Aqui van los datos de la persona logueada.
			Persona persona = new Persona();
			String userName = SecurityContextHolder.getContext().getAuthentication().getName();
			if(userName!=null){
				String userID = userName.substring(userName.lastIndexOf("@")+1);
				Integer id = Integer.parseInt(userID);
				persona.setId(id);
			}
			
			Map<String,String[]> queryMap = new HashMap<String,String[]>();
			amigos = personaController.getFriendsByFilters(persona, queryMap);
		} catch (DBException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void buscar(){		
		// Aqui van los datos de la persona logueada.
		Persona persona = new Persona();
		String userName = SecurityContextHolder.getContext().getAuthentication().getName();
		if(userName!=null){
			String userID = userName.substring(userName.lastIndexOf("@")+1);
			Integer id = Integer.parseInt(userID);
			persona.setId(id);
		}
		
		
		Map <String,String[]> mapaConsulta = new HashMap<String,String[]>();
    	String[] valor = new String[2];
    	// Filtrar por el ide de la persona logueada
    	
    	
    	if (slctId){
    		valor = new String[2];
    		valor[0] = idFiltro;
    		valor[1] = DataBaseDictionary.COLUMN_TYPE_COMENTARIO_ID_PERSONA;      		
    		mapaConsulta.put(DataBaseDictionary.COLUMN_FILTRO_NAME_COMENTARIO_ID_PERSONA, valor);
    		
    	}
    	if (slctNombre){
    		valor = new String[2];
			valor[0] = nombreFiltro;
			valor[1] = DataBaseDictionary.COLUMN_TYPE_PERSONA_NOMBREPERSONA;
			mapaConsulta
					.put(DataBaseDictionary.COLUMN_FILTER_NAME_PERSONA_NOMBREPERSONA,
							valor);
    	}
    	if (slctUsuario){
    		valor = new String[2];
			valor[0] = usuarioFiltro;
			valor[1] = DataBaseDictionary.COLUMN_TYPE_PERSONA_NOMBREUSUARIO_LIKE;
			mapaConsulta
					.put(DataBaseDictionary.COLUMN_FILTER_NAME_PERSONA_NOMBREUSUARIO_LIKE,
							valor);    		
    	}        
    	if (slctCorreo){
    		valor = new String[2];
			valor[0] = correoFiltro;
			valor[1] = DataBaseDictionary.COLUMN_TYPE_PERSONA_CORREO;
			mapaConsulta
					.put(DataBaseDictionary.COLUMN_FILTER_NAME_PERSONA_CORREO,
							valor);    		
    	}   
        try {
            //Se realiza la consulta
            amigos = personaController.getFriendsByFilters(persona, mapaConsulta);            
        } catch (DBException ex) {
            //Si existe cualquier error, se muestra el mensaje de error al tipo
            errorMsg = ex.getMessage();
        }
    }
	
	public void validaFormatoID(FacesContext context, UIComponent validate, Object value) {
        String id = (String) value;
        //Se verifica que el checkbox este seleccionado
        if (slctId) {
            //Se intenta convertir a entero, si hay un error, se coloca en el
            //mensaje designado para estoo
            try {
                Integer.parseInt(id);
            } catch (NumberFormatException ex) {
                ((UIInput) validate).setValid(false);
                FacesMessage msg = new FacesMessage("Solo se permiten digitos");
                context.addMessage(validate.getClientId(context), msg);
            }
        }
    }
}
